package com.freeleaps.devops

/**
 * 源代码获取器类
 * 负责从Git仓库克隆源代码到Jenkins工作空间
 * 这是CI/CD流程中的第一步，为后续的构建、测试、扫描等步骤准备源代码
 */
class SourceFetcher {
  // Jenkins Pipeline的steps对象，用于调用Jenkins内置功能
  def steps

  /**
   * 构造函数
   * @param steps Jenkins Pipeline的steps对象，提供访问Jenkins功能的能力
   */
  SourceFetcher(steps) {
    this.steps = steps
  }

  /**
   * 获取源代码的主要方法
   * 从配置的Git仓库克隆指定分支的代码到Jenkins工作空间
   * 
   * @param configurations 包含Git仓库配置的Map对象
   *                      - serviceGitRepo: Git仓库URL
   *                      - serviceGitBranch: 要克隆的分支名
   *                      - serviceGitCredentialsId: Jenkins中存储的Git认证凭据ID
   *                      - serviceName: 服务名称，用于创建工作目录
   */
  def fetch(configurations) {
    // 参数验证：检查Git仓库URL是否提供
    if (configurations.serviceGitRepo == null || configurations.serviceGitRepo.isEmpty()) {
      steps.error("serviceGitRepo is required")
    }

    // 参数验证：检查Git分支是否提供
    if (configurations.serviceGitBranch == null || configurations.serviceGitBranch.isEmpty()) {
      steps.error("serviceGitBranch is required")
    }

    // 设置工作根目录路径
    // 格式：${WORKSPACE}/devops-workspace/${serviceName}
    // 这样可以为每个服务创建独立的工作目录，避免不同服务之间的代码冲突
    steps.env.workroot = "${steps.env.WORKSPACE}/devops-workspace/${configurations.serviceName}"

    // 在指定的工作目录中执行Git克隆操作
    steps.dir(steps.env.workroot) {
      // 使用Jenkins的Git插件克隆代码仓库
      // branch: 指定要克隆的分支
      // credentialsId: 使用Jenkins中存储的认证凭据（用户名/密码或SSH密钥）
      // url: Git仓库的URL地址
      steps.git branch: configurations.serviceGitBranch, 
                credentialsId: configurations.serviceGitCredentialsId, 
                url: configurations.serviceGitRepo
    }
  }
}